<div class="container">
    <div ng-controller="guideController">
        <div class="row">
            <div class="col-sm-3" style="position: relative;min-height: 1px;">
                <div style="position: fixed;top:65px;width: 225px;">
                    <div class="panel panel-default" ng-if="$security$.user.isDeveloper || !$security$.user.creator">
                        <div class="panel-heading"><label>开发手册</label></div>
                        <div class="list-group" >
                            <a href="javascript:void(0)" ng-click="anchorScroll('a1')" class="list-group-item"><label>我的生成器</label></a>
                            <a href="javascript:void(0)" ng-click="anchorScroll('a2')" class="list-group-item"><label>数据模型</label></a>
                            <a href="javascript:void(0)" ng-click="anchorScroll('a3')" class="list-group-item"><label>模板文件</label></a>
                            <a href="javascript:void(0)" ng-click="anchorScroll('a4')" class="list-group-item"><label>生成策略</label></a>
                            <a href="javascript:void(0)" ng-click="anchorScroll('a5')" class="list-group-item"><label>数据结构</label></a>
                            <a href="javascript:void(0)" ng-click="anchorScroll('a8')" class="list-group-item"><label>注意事项</label></a>
                        </div>
                    </div>
                    <div class="panel panel-default">
                        <div class="panel-heading"><label>用户手册</label></div>
                        <div class="list-group" >
                            <a href="javascript:void(0)" ng-click="anchorScroll('a6')" class="list-group-item"><label>他们的生成器</label></a>
                            <a href="javascript:void(0)" ng-click="anchorScroll('a7')" class="list-group-item"><label>我的实例</label></a>
                        </div>
                    </div>
                </div>
            </div>
            <div class="col-sm-9">
                <div class="panel panel-default" id="a1" ng-if="$security$.user.isDeveloper || !$security$.user.creator">
                    <div class="panel-heading">
                        <h3 class="panel-title"><label>我的生成器</label></h3>
                    </div>
                    <div class="panel-body">
                        <p>一个生成器由<span class="text-warning">数据模型</span>、<span class="text-warning">模板文件</span>、<span class="text-warning">生成策略</span>三部分构成。</p>
                        <p>用户先是在工作台根据生成器定义的<span class="text-warning">数据模型</span>输入相应的生成数据，然后选择<span class="text-warning">生成策略</span>执行生成操作，最后生成器根据<span class="text-warning">生成策略</span>及其对应的<span class="text-warning">模板文件</span>来生成相应的文件及文件夹。</p>
                        <p>生成器有<span class="text-warning">发布</span>和<span class="text-warning">维护</span>两个状态，对<span class="text-warning">数据模型</span>、<span class="text-warning">模板文件</span>、<span class="text-warning">生成策略</span>进行编辑（增删改）后，生成器自动进入<span class="text-warning">维护</span>状态，开发者需手动发布才能更改生成器状态为<span class="text-warning">发布</span>状态。在<span class="text-warning">维护</span>状态只有该生成器开发者能够编辑生成数据，使用者必须等待开发者<span class="text-warning">发布</span>生成器后才能编辑。</p>
                        <p>
                            生成器被（除了开发者自己以外的）使用者新建实例后，生成器就不得删除了（同时该生成器定义的<span class="text-warning">数据模型</span>也不能删除了）。
                            因为<span class="text-warning">数据模型</span>定义了使用者生成数据的数据结构，一旦删除，使用者编辑的生成数据将直接失效。
                            而<span class="text-warning">模板文件</span>和<span class="text-warning">生成策略</span>是生成器生成文件时的临时策略，和使用者生成数据并不相关，由开发者维护，所以可以删除。
                        </p>
                    </div>
                </div>
                <div class="panel panel-default" id="a2" ng-if="$security$.user.isDeveloper || !$security$.user.creator">
                    <div class="panel-heading">
                        <h3 class="panel-title"><label>数据模型</label></h3>
                    </div>
                    <div class="panel-body">
                        <p>数据模型（<span class="text-warning">DynamicModel</span>类型）定义了生成器所需生成数据的数据类型结构，每个生成器可制定多个数据模型。</p>
                        <div class="panel panel-default">
                            <div class="panel-heading"><label>名称</label></div>
                            <div class="panel-body">
                                <p>数据模型的名称。</p>
                            </div>
                        </div>
                        <div class="panel panel-default">
                            <div class="panel-heading"><label>图标</label></div>
                            <div class="panel-body">
                                <p>数据模型的图标。</p>
                            </div>
                        </div>
                        <div class="panel panel-default">
                            <div class="panel-heading"><label>顶级模型</label></div>
                            <div class="panel-body">
                                <p>顶级模型定义了该数据模型能不能作为顶级模型直接添加（即通过工作台新建按钮添加）。</p>
                            </div>
                        </div>
                        <div class="panel panel-default">
                            <div class="panel-heading"><label>子级模型</label></div>
                            <div class="panel-body">
                                <p>子级模型定义了该数据模型下能添加的子级数据模型类型。</p>
                            </div>
                        </div>
                        <div class="panel panel-default">
                            <div class="panel-heading"><label>普通属性</label></div>
                            <div class="panel-body">
                                <p>普通属性定义了<span class="text-warning">DataModel</span>类型<span class="text-info">properties</span>属性的数据结构。</p>
                                <table class="table table-condensed table-hover">
                                    <thead>
                                    <tr class="active">
                                        <th class="col-sm-3">列名</th>
                                        <th>列说明</th>
                                    </tr>
                                    </thead>
                                    <tbody>
                                    <tr>
                                        <td><span class="text-info">可隐藏</span></td>
                                        <td>对组件太多的情况，可以使用此设置使得一部分组件预先隐藏。<span class="text-danger">（然而暂不支持此设置）</span></td>
                                    </tr>
                                    <tr>
                                        <td><span class="text-info">分组</span></td>
                                        <td>对<span class="text-warning">HTML</span>控件进行分组显示，没有分组的控件换行显示（一行显示一个，标题-控件-换行），在同一个分组的控件内联显示（一行显示多个，分组-标题1-控件1-标题2-控件2-...换行）。</td>
                                    </tr>
                                    <tr>
                                        <td><span class="text-info">标题</span></td>
                                        <td>对应的<span class="text-warning">HTML</span>控件的中文提示。</td>
                                    </tr>
                                    <tr>
                                        <td><span class="text-info">宽度</span></td>
                                        <td>对应的<span class="text-warning">HTML</span>控件的宽度。</td>
                                    </tr>
                                    <tr>
                                        <td><span class="text-info">名称</span></td>
                                        <td><span class="text-info">properties</span>对应的<span class="text-info">Key</span>。</td>
                                    </tr>
                                    <tr id="typeApi">
                                        <td><span class="text-info">类型</span></td>
                                        <td>
                                            <p><span class="text-info">properties</span>对应的<span class="text-info">Key</span>的值类型，不同类型对应不同的<span class="text-warning">HTML</span>控件。</p>
                                            <p>支持<span class="text-info">布尔型</span>、<span class="text-info">整数型</span>、<span class="text-info">浮点型</span>、<span class="text-info">字符串型</span>、<span class="text-info">日期型</span>、<span class="text-info">枚举型</span>、<span class="text-info">数据模型</span>。</p>
                                            <p><span class="text-info">布尔型</span>对应<span class="text-warning">Java</span>的<span class="text-info">java.lang.Boolean</span>类型，<span class="text-warning">HTML</span>的<span class="text-info">input[checkbox]</span>控件。</p>
                                            <p><span class="text-info">整数型</span>对应<span class="text-warning">Java</span>的<span class="text-info">java.lang.Long</span>类型，<span class="text-warning">HTML</span>的<span class="text-info">input[number]</span>控件。</p>
                                            <p><span class="text-info">浮点型</span>对应<span class="text-warning">Java</span>的<span class="text-info">java.lang.Double</span>类型，<span class="text-warning">HTML</span>的<span class="text-info">input[number]</span>控件。</p>
                                            <p><span class="text-info">字符串型</span>对应<span class="text-warning">Java</span>的<span class="text-info">java.lang.String</span>类型，<span class="text-warning">HTML</span>的<span class="text-info">input[text]</span>控件。</p>
                                            <p><span class="text-info">枚举型型</span>对应<span class="text-warning">Java</span>的<span class="text-info">java.lang.String数组</span>类型，<span class="text-warning">HTML</span>的<span class="text-info">select</span>控件。</p>
                                            <p><span class="text-info">日期型</span>对应<span class="text-warning">Java</span>的<span class="text-info">java.util.Date</span>类型，<span class="text-warning">HTML</span>的<span class="text-info">input[text]</span>控件（日期插件）。</p>
                                            <p><span class="text-info">数据模型</span>对应当前生成器中已定义的所有<span class="text-warning">DataModel</span>类型，<span class="text-warning">HTML</span>的<span class="text-info">input[text]</span>控件（数据模型选择对话框）。</p>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td><span class="text-info">默认值</span></td>
                                        <td>添加<span class="text-info">properties</span>对应<span class="text-info">Key</span>的值时的默认值。</td>
                                    </tr>
                                    <tr>
                                        <td><span class="text-info">可选值</span></td>
                                        <td>对于<span class="text-info">Enum</span>枚举类型的枚举值。</td>
                                    </tr>
                                    <tr>
                                        <td><span class="text-info">级联脚本</span></td>
                                        <td>
                                            <p><span class="text-warning">HTML</span>控件<span class="text-info">change</span>事件所触发执行的脚本，一般用作级联操作。</p>
                                            <p>级联脚本用<span class="text-warning">JavaScript</span>编写， 脚本内置变量<span class="text-info">$property</span>。</p>
                                            <p><span class="text-info">$property</span>的引用等于<span class="text-info">properties</span>，通过<span class="text-info">$property[名称]</span>或者<span class="text-info">$property.名称</span>来访问属性的值。</p>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td><span class="text-info">验证规则</span></td>
                                        <td>添加<span class="text-info">properties</span>对应<span class="text-info">Key</span>的值的验证规则。</td>
                                    </tr>
                                    </tbody>
                                </table>
                            </div>
                        </div>
                        <div class="panel panel-default">
                            <div class="panel-heading"><label>联合属性</label></div>
                            <div class="panel-body">
                                <p>联合属性定义了<span class="text-warning">DataModel</span>类型<span class="text-info">association</span>属性集合元素的数据结构。</p>
                                <table class="table table-condensed table-hover">
                                    <thead>
                                    <tr class="active">
                                        <th class="col-sm-3">列名</th>
                                        <th>列说明</th>
                                    </tr>
                                    </thead>
                                    <tbody>
                                    <tr>
                                        <td><span class="text-info">可隐藏</span></td>
                                        <td>对表格列太多的情况，可以使用此设置使得一部分列预先隐藏。在用户工作台<span class="text-info">显示/隐藏列</span>按钮可控制。</td>
                                    </tr>
                                    <tr>
                                        <td><span class="text-info">分组</span></td>
                                        <td>对表格列的标题进行分组显示。</td>
                                    </tr>
                                    <tr>
                                        <td><span class="text-info">标题</span></td>
                                        <td>用户在工作台添加时，表格列的标题。</td>
                                    </tr>
                                    <tr>
                                        <td><span class="text-info">宽度</span></td>
                                        <td>用户在工作台添加时，表格列的宽度。</td>
                                    </tr>
                                    <tr>
                                        <td><span class="text-info">名称</span></td>
                                        <td>集合元素对应的<span class="text-info">Key</span>。</td>
                                    </tr>
                                    <tr>
                                        <td><span class="text-info">类型</span></td>
                                        <td>
                                            <p>集合元素对应<span class="text-info">Key</span>的值类型，不同类型对应不同的<span class="text-warning">HTML</span>控件。</p>
                                            <p>支持类型同<a href="javascript:void(0)" ng-click="anchorScroll('typeApi')">普通属性-类型</a>。</p>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td><span class="text-info">默认值</span></td>
                                        <td>添加集合元素对应<span class="text-info">Key</span>的值时的默认值。</td>
                                    </tr>
                                    <tr>
                                        <td><span class="text-info">可选值</span></td>
                                        <td>对于<span class="text-info">Enum</span>枚举类型的枚举值。</td>
                                    </tr>
                                    <tr>
                                        <td><span class="text-info">级联脚本</span></td>
                                        <td>
                                            <p><span class="text-warning">HTML</span>控件<span class="text-info">change</span>事件所触发执行的脚本，一般用作级联操作。</p>
                                            <p>级联脚本用<span class="text-warning">JavaScript</span>编写， 脚本内置变量<span class="text-info">$property</span>。</p>
                                            <p><span class="text-info">$property</span>的引用等于集合元素，通过<span class="text-info">$property[名称]</span>或者<span class="text-info">$property.名称</span>来访问属性的值。</p>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td><span class="text-info">验证规则</span></td>
                                        <td>添加集合元素对应<span class="text-info">Key</span>的值的验证规则。</td>
                                    </tr>
                                    </tbody>
                                </table>
                            </div>
                        </div>
                        <div class="panel panel-default">
                            <div class="panel-heading"><label>快捷预设</label></div>
                            <div class="panel-body">
                                <p>根据联合属性的定义，预设<span class="text-warning">DataModel</span>类型<span class="text-info">association</span>属性的值，通过工作台<span class="text-info">添加-快捷添加</span>菜单添加。</p>
                            </div>
                        </div>
                   </div>
                </div>
                <div class="panel panel-default" id="a3" ng-if="$security$.user.isDeveloper || !$security$.user.creator">
                    <div class="panel-heading">
                        <h3 class="panel-title"><label>模板文件</label></h3>
                    </div>
                    <div class="panel-body">
                        <p>模板文件定义了生成文件的模板，采用<span class="text-warning">Velocity</span>模板实现。</p>
                        <p><span class="text-warning">Velocity</span>模板所能访问的变量由生成策略的<span class="text-warning">TemplateContext</span>标签定义。</p>
                        <table class="table table-condensed table-hover">
                            <caption>模板内置变量 <a target="_blank" href="http://velocity.apache.org/tools/releases/2.0/generic.html" class="text-info">API文档</a></caption>
                            <thead>
                                <tr class="active">
                                    <th class="col-sm-3">变量名</th>
                                    <th>变量说明</th>
                                </tr>
                            </thead>
                            <tbody>
                                <tr><td><span class="text-info">alternatorTool</span></td><td></td></tr>
                                <tr><td><span class="text-info">classTool</span></td><td></td></tr>
                                <tr><td><span class="text-info">contextTool</span></td><td></td></tr>
                                <tr><td><span class="text-info">conversionTool</span></td><td></td></tr>
                                <tr><td><span class="text-info">dateTool</span></td><td>对Date操作：格式化、比较等。</td></tr>
                                <tr><td><span class="text-info">displayTool</span></td><td></td></tr>
                                <tr><td><span class="text-info">escapeTool</span></td><td>对template进行escaping。</td></tr>
                                <tr><td><span class="text-info">fieldTool</span></td><td></td></tr>
                                <tr><td><span class="text-info">loopTool</span></td><td>更好地控制 #foreach loop。</td></tr>
                                <tr><td><span class="text-info">linkTool</span></td><td></td></tr>
                                <tr><td><span class="text-info">listTool</span></td><td>透明地处理array和list。</td></tr>
                                <tr><td><span class="text-info">mathTool</span></td><td>数学运算。</td></tr>
                                <tr><td><span class="text-info">numberTool</span></td><td>对数字格式化和convert。</td></tr>
                                <tr><td><span class="text-info">renderTool</span></td><td>对VTL的字符串执行 eval。</td></tr>
                                <tr><td><span class="text-info">resourceTool</span></td><td>国际化支持。</td></tr>
                                <tr><td><span class="text-info">sortTool</span></td><td>对collections array iterator进行排序。</td></tr>
                                <tr><td><span class="text-info">xmlTool</span></td><td>对xml文件读取，需要dom4j的支持。</td></tr>
                            </tbody>
                        </table>
                    </div>
                </div>
                <div class="panel panel-default" id="a4" ng-if="$security$.user.isDeveloper || !$security$.user.creator">
                    <div class="panel-heading">
                        <h3 class="panel-title"><label>生成策略</label></h3>
                    </div>
                    <div class="panel-body">
                        <p>生成策略是一组标签集，定义了生成文件和生成文件夹的规则。</p>
                        <p>标签中的属性采用<span class="text-warning">EL表达式</span>访问变量。</p>
                        <p>策略内置变量<span class="text-info">global</span>（<span class="text-warning">Global</span>类型）和<span class="text-info">data</span>（<span class="text-warning">DataModel</span>类型）。</p>
                        <table class="table table-condensed table-hover">
                            <caption>策略内置标签</caption>
                            <thead>
                            <tr class="active">
                                <th class="col-sm-3">标签名</th>
                                <th>标签说明</th>
                            </tr>
                            </thead>
                            <tbody>
                            <tr>
                                <td><span class="text-info">Break</span></td>
                                <td><p>用于跳出<span class="text-info">Foreach</span>标签。</p></td>
                            </tr>
                            <tr>
                                <td><span class="text-info">Call</span></td>
                                <td>
                                    <p>调用<span class="text-info">Function</span>标签定义的函数。</p>
                                    <p><span class="text-primary">function</span>（静态字符串）函数名称。 </p>
                                    <p><span class="text-primary">argument1</span>（EL表达式获取的对象类型） 实参1。</p>
                                    <p><span class="text-primary">argument2</span>（EL表达式获取的对象类型） 实参2。</p>
                                    <p><span class="text-primary">argument3</span>（EL表达式获取的对象类型） 实参3。</p>
                                    <p><span class="text-primary">argument4</span>（EL表达式获取的对象类型） 实参4。</p>
                                </td>
                            </tr>
                            <tr>
                                <td><span class="text-info">Continue</span></td>
                                <td><p>用于<span class="text-info">Foreach</span>标签的Continue操作。</p></td>
                            </tr>
                            <tr>
                                <td><span class="text-info">File</span></td>
                                <td>
                                    <p>动态根据模板文件动态生成一个文件。用 <span class="text-warning">/</span> 符号来分割文件夹目录，会自动生成文件夹及子文件夹。</p>
                                    <p><span class="text-primary">name</span>（支持EL表达式的字符串） 生成文件名称（全路径）。</p>
                                    <p>示例值：com/xx/${module.name}/domain/${domain.name}.java</p>
                                    <p><span class="text-primary">template</span>（选择预定义的模板文件） 生成文件用到的模板文件。</p>
                                </td>
                            </tr>
                            <tr>
                                <td><span class="text-info">Folder</span></td>
                                <td>
                                    <p>动态生成一个文件夹。用 <span class="text-warning">/</span> 符号来分割文件夹目录，会自动生成文件夹及子文件夹。</p>
                                    <p><span class="text-primary">name</span>（支持EL表达式的字符串） 生成文件夹名称（全路径）。</p>
                                    <p>示例值：com/${project.name}/${module.name}/domain</p>
                                </td>
                            </tr>
                            <tr>
                                <td><span class="text-info">Foreach</span></td>
                                <td>
                                    <p>迭代一个对象，支持<span class="text-info">Collection</span>，<span class="text-info">Map</span>，<span class="text-info">Array</span>，<span class="text-info">Iterator</span>，<span class="text-info">Enumeration</span>类型。</p>
                                    <p><span class="text-primary">item</span>（静态字符串） 迭代参数。</p>
                                    <p><span class="text-primary">items</span>（EL表达式获取的集合类型） 迭代的集合变量。</p>
                                    <p>示例值：${module.children}</p>
                                    <p><span class="text-primary">status</span>（静态字符串） 迭代变量的名称，用来表示迭代的状态，可以访问到迭代自身的信息。
                                        属性：<span class="text-info">first</span>，<span class="text-info">last</span>，<span class="text-info">index</span>，<span class="text-info">count</span>。
                                    </p>
                                </td>
                            </tr>
                            <tr>
                                <td><span class="text-info">Function</span></td>
                                <td>
                                    <p>定义一个函数。</p>
                                    <p><span class="text-primary">name</span>（静态字符串） 函数名称。</p>
                                    <p><span class="text-primary">argument1</span>（静态字符串） 形参1。</p>
                                    <p><span class="text-primary">argument2</span>（静态字符串） 形参2。</p>
                                    <p><span class="text-primary">argument3</span>（静态字符串） 形参3。</p>
                                    <p><span class="text-primary">argument4</span>（静态字符串） 形参4。</p>
                                </td>
                            </tr>
                            <tr>
                                <td><span class="text-info">If</span></td>
                                <td>
                                    <p>用于条件判断。</p>
                                    <p><span class="text-primary">test</span>（EL表达式获取的布尔类型） If的判断条件。</p>
                                    <p>示例值：${isSuccess}</p>
                                </td>
                            </tr>
                            <tr>
                                <td><span class="text-info">Return</span></td>
                                <td><p>用于跳出<span class="text-info">Function</span>标签</td>
                            </tr>
                            <tr>
                                <td><span class="text-info">Set</span></td>
                                <td>
                                    <p>设置一个变量。</p>
                                    <p><span class="text-primary">var</span>（静态字符串） 变量名。</p>
                                    <p><span class="text-primary">value</span>（EL表达式获取的对象类型） 变量值。</p>
                                </td>
                            </tr>
                            <tr>
                                <td><span class="text-info">TemplateContext</span></td>
                                <td>
                                    <p>定义模板文件（<span class="text-warning">Velocity</span>模板）用到的变量。</p>
                                    <p><span class="text-primary">var</span>（静态字符串） 变量名。</p>
                                    <p><span class="text-primary">value</span>（EL表达式获取的对象类型） 变量值。</p>
                                </td>
                            </tr>
                            <tr>
                                <td><span class="text-info">TemplateStrategy</span></td>
                                <td>
                                    <p>定义一个生成策略。</p>
                                    <p><span class="text-primary">name</span>（静态字符串） 名称。</p>
                                </td>
                            </tr>
                            <tr>
                                <td><span class="text-info">Var</span></td>
                                <td>
                                    <p>定义一个变量。</p>
                                    <p><span class="text-primary">name</span>（静态字符串） 变量名。</p>
                                    <p><span class="text-primary">value</span>（EL表达式获取的对象类型） 变量值。</p>
                                </td>
                            </tr>
                            </tbody>
                        </table>
                        <table class="table table-condensed table-hover">
                            <caption>策略内置函数</caption>
                            <thead>
                            <tr class="active">
                                <th class="col-sm-3">函数名</th>
                                <th class="col-sm-4">函数说明</th>
                                <th>使用举例</th>
                            </tr>
                            </thead>
                            <tbody>
                                <tr>
                                    <td><span class="text-info">fn:contains</span></td>
                                    <td>判断字符串是否包含另外一个字符串。</td>
                                    <td>${fn:contains(name, searchString)}</td>
                                </tr>
                                <tr>
                                    <td><span class="text-info">fn:containsIgnoreCase</span></td>
                                    <td>判断字符串是否包含另外一个字符串(大小写无关)。</td>
                                    <td>${fn:containsIgnoreCase(name, searchString)}</td>
                                </tr>
                                <tr>
                                    <td><span class="text-info">fn:endsWith</span></td>
                                    <td>判断字符串是否以另外字符串结束。</td>
                                    <td>${fn:endsWith(filename, ".txt")}</td>
                                </tr>
                                <tr>
                                    <td><span class="text-info">fn:escapeXml</span></td>
                                    <td>把一些字符转成XML表示，例如&lt;字符应该转为&amp;lt;。</td>
                                    <td>${fn:escapeXml(param)}</td>
                                </tr>
                                <tr>
                                    <td><span class="text-info">fn:indexOf</span></td>
                                    <td>子字符串在母字符串中出现的位置。</td>
                                    <td>${fn:indexOf(name, "-")}</td>
                                </tr>
                                <tr>
                                    <td><span class="text-info">fn:join</span></td>
                                    <td>将数组中的数据联合成一个新字符串，并使用指定字符格开。</td>
                                    <td>${fn:join(array, ";")}</td>
                                </tr>
                                <tr>
                                    <td><span class="text-info">fn:length</span></td>
                                    <td>获取字符串的长度，或者数组的大小。</td>
                                    <td>${fn:length(shoppingCart.products)}</td>
                                </tr>
                                <tr>
                                    <td><span class="text-info">fn:replace</span></td>
                                    <td>替换字符串中指定的字符。</td>
                                    <td>${fn:replace(text, "-", "&amp;#149;")}</td>
                                </tr>
                                <tr>
                                    <td><span class="text-info">fn:split</span></td>
                                    <td>把字符串按照指定字符切分。</td>
                                    <td>${fn:split(customerNames, ";")}</td>
                                </tr>
                                <tr>
                                    <td><span class="text-info">fn:startsWith</span></td>
                                    <td>判断字符串是否以某个子串开始。</td>
                                    <td>${fn:startsWith(product.id, "100-")}</td>
                                </tr>
                                <tr>
                                    <td><span class="text-info">fn:substring</span></td>
                                    <td>获取子串。</td>
                                    <td>${fn:substring(zip, 6, -1)}</td>
                                </tr>
                                <tr>
                                    <td><span class="text-info">fn:substringAfter</span></td>
                                    <td>
                                        <p><span>获取从某个字符所在位置开始的子串。</span></p>
                                    </td>
                                    <td>${fn:substringAfter(zip, "-")}</td>
                                </tr>
                                <tr>
                                    <td><span class="text-info">fn:substringBefore</span></td>
                                    <td>获取从开始到某个字符所在位置的子串。</td>
                                    <td>${fn:substringBefore(zip, "-")}</td>
                                </tr>
                                <tr>
                                    <td><span class="text-info">fn:toLowerCase</span></td>
                                    <td>转为小写。</td>
                                    <td>${fn:toLowerCase(product.name)}</td>
                                </tr>
                                <tr>
                                    <td><span class="text-info">fn:toUpperCase</span></td>
                                    <td>转为大写字符。</td>
                                    <td>${fn:toUpperCase(product.name)}</td>
                                </tr>
                                <tr>
                                    <td><span class="text-info">fn:trim</span></td>
                                    <td>去除字符串前后的空格。</td>
                                    <td>${fn:trim(name)}</td>
                                </tr>
                            </tbody>
                        </table>
                    </div>
                </div>
                <div class="panel panel-default" id="a5" ng-if="$security$.user.isDeveloper || !$security$.user.creator">
                    <div class="panel-heading">
                        <h3 class="panel-title"><label>数据结构</label></h3>
                    </div>
                    <div class="panel-body">
                        <p><span class="text-warning">Java</span>编程语言类型，相应的<span class="text-warning">JSON</span>结构相同。</p>
                        <p>
                            <pre style="background-color:inherit;">
<span class="text-success">//全局变量（生成器在生成运行时的一些信息）</span>
<strong class="text-warning">Global</strong> <span class="text-warning">{</span>

    <span class="text-success">//生成号</span>
    <span class="text-primary">Long</span> <span class="text-info">generateId</span>

    <span class="text-success">//生成文件时的用户</span>
    <span class="text-primary">User</span> <span class="text-info">user</span>

    <span class="text-success">//生成器开发者</span>
    <span class="text-primary">User</span> <span class="text-info">developer</span>

    <span class="text-success">//生成器</span>
    <span class="text-primary">Generator</span> <span class="text-info">generator</span>

    <span class="text-success">//生成器实例</span>
    <span class="text-primary">GeneratorInstance</span> <span class="text-info">generatorInstance</span>

    <span class="text-success">//生成策略</span>
    <span class="text-primary">TemplateStrategy</span> <span class="text-info">templateStrategy</span>
<span class="text-warning">}</span>

<span class="text-success">//生成数据（在工作台输入的用于生成器的源数据）</span>
<strong class="text-warning">DataModel</strong> <span class="text-warning">{</span>

    <span class="text-success">//ID</span>
    <span class="text-primary">Long</span> <span class="text-info">id</span>

    <span class="text-success">//数据对象的名称</span>
    <span class="text-primary">String</span> <span class="text-info">name</span>

    <span class="text-success">//上级</span>
    <span class="text-primary">DataModel</span> <span class="text-info">parent</span>

    <span class="text-success">//子级</span>
    <span class="text-primary">List&lt;DataModel></span> <span class="text-info">children</span>

    <span class="text-success">//由数据模型设定的普通属性</span>
    <span class="text-primary">Map&lt;String, Object></span> <span class="text-info">properties</span>

    <span class="text-success">//由数据模型设定的联合属性</span>
    <span class="text-primary">List&lt;Map&lt;String, Object>></span> <span class="text-info">association</span>

    <span class="text-success">//定义该DataModel的properties属性和association属性的模型</span>
    <span class="text-primary">DynamicModel</span> <span class="text-info">dynamicModel</span>
<span class="text-warning">}</span>

<span class="text-success">//用户</span>
<strong class="text-warning">User</strong> <span class="text-warning">{</span>

    <span class="text-success">//ID</span>
    <span class="text-primary">Long</span> <span class="text-info">id</span>

    <span class="text-success">//用户名</span>
    <span class="text-primary">String</span> <span class="text-info">userName</span>
<span class="text-warning">}</span>

<span class="text-success">//生成器</span>
<strong class="text-warning">Generator</strong> <span class="text-warning">{</span>

    <span class="text-success">//ID</span>
    <span class="text-primary">Long</span> <span class="text-info">id</span>

    <span class="text-success">//生成器名称</span>
    <span class="text-primary">String</span> <span class="text-info">name</span>
<span class="text-warning">}</span>

<span class="text-success">//生成器实例</span>
<strong class="text-warning">GeneratorInstance</strong> <span class="text-warning">{</span>

    <span class="text-success">//ID</span>
    <span class="text-primary">Long</span> <span class="text-info">id</span>

    <span class="text-success">//生成器实例名称</span>
    <span class="text-primary">String</span> <span class="text-info">name</span>
<span class="text-warning">}</span>

<span class="text-success">//生成策略</span>
<strong class="text-warning">TemplateStrategy</strong> <span class="text-warning">{</span>

    <span class="text-success">//ID</span>
    <span class="text-primary">Long</span> <span class="text-info">id</span>

    <span class="text-success">//生成策略名称</span>
    <span class="text-primary">String</span> <span class="text-info">name</span>
<span class="text-warning">}</span>

<span class="text-success">//数据模型</span>
<strong class="text-warning">DynamicModel</strong> <span class="text-warning">{</span>

    <span class="text-success">//ID</span>
    <span class="text-primary">Long</span> <span class="text-info">id</span>

    <span class="text-success">//数据模型名称</span>
    <span class="text-primary">String</span> <span class="text-info">name</span>
<span class="text-warning">}</span>
                            </pre>
                        </p>
                    </div>
                </div>
                <div class="panel panel-default" id="a8" ng-if="$security$.user.isDeveloper || !$security$.user.creator">
                    <div class="panel-heading">
                        <h3 class="panel-title"><label>注意事项</label></h3>
                    </div>
                    <div class="panel-body">
                        <p>1. 在开发设计生成器时，对需要采集的用户数据和最终生成的文件结构要有清晰的认知。</p>
                        <p>2. 通过对用户数据的抽象封装成一组<span class="text-warning">数据模型</span>来接收用户输入的生成数据。</p>
                        <p>3. 通过对生成文件结构的抽象封装成一组<span class="text-warning">模板文件</span>和<span class="text-warning">生成策略</span>。</p>
                        <p>4. <span class="text-warning">生成策略</span>结合<span class="text-warning">数据模型</span>和<span class="text-warning">模板文件</span>生成相应的文件和文件结构。</p>
                        <p>5. 在开发设计生成器取变量名时（特别是定义数据模型普通属性名称和联合属性名称时），<strong class="text-warning">不要用<span class="text-warning">Java</span>关键字、保留字！</strong></p>
                    </div>
                </div>
                <div class="panel panel-default" id="a6">
                    <div class="panel-heading">
                        <h3 class="panel-title"><label>他们的生成器</label></h3>
                    </div>
                    <div class="panel-body">
                       <p>由开发者制定好的生成器，使用者搜索出目标生成器即可使用（新建实例）。</p>
                    </div>
                </div>
                <div class="panel panel-default" id="a7">
                    <div class="panel-heading">
                        <h3 class="panel-title"><label>我的实例</label></h3>
                    </div>
                    <div class="panel-body">
                        <p>每个生成器可以创建多个实例，一个实例一份数据。</p>
                        <p>用户通过搜索出的生成器新建实例，然后进工作台进行生成器数据的输入，最后通过生成器工具生成目标文件。</p>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>